#include <stdio.h>
#include <stdint.h>
#include <math.h>

#define PI 3.14159265358979323846
#define Q15_SCALE 32767.0f  // Q15格式的缩放因子

int16_t sin_table[91];
int16_t cos_table[91];

void generateASineCosineTable();
void checkSinCosTable();
int16_t q15_sin(int angle);
int16_t q15_cos(int angle);

int main()
{
	printf("Hello git!\n");
	printf("This is a test.\n");

	generateASineCosineTable();
    checkSinCosTable();
	
	return 0;
}

void generateASineCosineTable() {
    int i = 0;

    printf("// 0-90度正弦值表（Q15格式，16位定点）\n");
    printf("const int16_t sin_table[91] = {\n    ");
    for (int angle = 0; angle <= 90; angle++) {
        double radians = angle * PI / 180.0;
        int16_t value = (int16_t)round(sin(radians) * Q15_SCALE);
        sin_table[i++] = value;
        printf("%5d", value);
        if (angle != 90) printf(", ");
        if ((angle + 1) % 10 == 0) printf("\n    ");  // 每行10个数值
    }
    printf("\n};\n\n");

    i = 0;

    printf("// 0-90度余弦值表（Q15格式，16位定点）\n");
    printf("const int16_t cos_table[91] = {\n    ");
    for (int angle = 0; angle <= 90; angle++) {
        double radians = angle * PI / 180.0;
        int16_t value = (int16_t)round(cos(radians) * Q15_SCALE);
        cos_table[i++] = value;
        printf("%5d", value);
        if (angle != 90) printf(", ");
        if ((angle + 1) % 10 == 0) printf("\n    ");
    }
    printf("\n};\n");
    return;
}

void checkSinCosTable() {
    int test_angles[] = {0, 30, 90, 180, 270, 360, -45};
    int num_angles = sizeof(test_angles) / sizeof(test_angles[0]);

    for (int i = 0; i < num_angles; i++) {
        int angle = test_angles[i];
        int16_t sin_val = q15_sin(angle);
        int16_t cos_val = q15_cos(angle);
        float sin_float = sin_val / 32767.0f;
        float cos_float = cos_val / 32767.0f;

        printf("角度: %4d°\t sin: %6d (%.4f)\t cos: %6d (%.4f)\n",
               angle, sin_val, sin_float, cos_val, cos_float);
    }

    return;
}

// 获取任意角度的正弦值（Q15格式）
int16_t q15_sin(int angle) {
    // 将角度归一化到0~359度
    angle %= 360;
    if (angle < 0) angle += 360;

    // 根据角度所在象限计算
    if (angle <= 90) {
        return sin_table[angle];
    } else if (angle <= 180) {
        return sin_table[180 - angle];
    } else if (angle <= 270) {
        return -sin_table[angle - 180];
    } else {
        return -sin_table[360 - angle];
    }
}


// 获取任意角度的余弦值（Q15格式）
int16_t q15_cos(int angle) {
    // 将角度归一化到0~359度
    angle %= 360;
    if (angle < 0) angle += 360;

    // 根据角度所在象限计算
    if (angle <= 90) {
        return cos_table[angle];
    } else if (angle <= 180) {
        return -cos_table[180 - angle];
    } else if (angle <= 270) {
        return -cos_table[angle - 180];
    } else {
        return cos_table[360 - angle];
    }
}